package DAO;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import to.Funcionario;
import to.Pessoa;
import to.Usuario;
import util.HibernateUtil;

public class FuncionarioDAO {
	public List<Funcionario> buscaTodos() throws Exception {
		List<Funcionario> listaRetorno = null;
		try {
			Session session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Funcionario.class);
			criteria.createAlias("pessoa", "p");
			criteria.addOrder(Order.asc("p.nome"));
			listaRetorno = (List<Funcionario>) criteria.list();
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		return listaRetorno;
	}
	public List<Funcionario> buscaEngenheiro() throws Exception {
		List<Funcionario> listaRetorno = null;
		try {
			Session session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Funcionario.class, "fun");
			criteria.createAlias("cargo", "car");
			criteria.add(Restrictions.ilike("car.descricao", "Engenheiro%"));
			criteria.createAlias("pessoa", "p");	
			criteria.addOrder(Order.asc("p.nome"));
			listaRetorno = (List<Funcionario>) criteria.list();
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		return listaRetorno;
	}
	public Funcionario pesquisarPorPessoa(Pessoa pessoa) throws Exception {
		Funcionario retorno = null;
		try {
			Session session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Funcionario.class);
			criteria.add(Restrictions.eq("pessoa", pessoa));
			criteria.setMaxResults(1);
			retorno =  (Funcionario) criteria.uniqueResult();
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		return retorno;
	}
	public Funcionario pesquisarFuncionarioUsuario(Usuario user) throws Exception {
		Funcionario funcionario = null;

		Session session = null;
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Funcionario.class, "fun")
					.createAlias("fun.pessoa", "pess")
					.createAlias("pess.usuario", "usu");			
			criteria.add(Restrictions.like("pess.usuario",  user));	

			funcionario = (Funcionario) criteria.uniqueResult();

		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}finally{
			session.close();
		}
		return funcionario;
	}
	public static void main(String[] args) {
		try {
			ArrayList<Funcionario>lista = (ArrayList<Funcionario>) new FuncionarioDAO().buscaEngenheiro();
			for(Funcionario funcionario : lista){
				System.out.println("Nome: "+funcionario.getPessoa().getNome());
				System.out.println("Cargo: "+funcionario.getCargo().getDescricao());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}	
	}
}
